﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KaartenLib
{
   public class KansSpel {
        private int inzetOpPunten = 0;
        private int inzetOpAantal = 0;
        private int aantalKaarten = 10;
        private String status = "";
        private SpelStatus spelStatus;
        private Speler speler;
        private KaartSoort troef;
        private KaartSpel kaartSpel;
        private List<Kaart> spelerKaarten = new List<Kaart>();
        private List<Kaart> computerKaarten = new List<Kaart>();
        private List<SpelBeurt> spelBeurten = new List<SpelBeurt>(); 

        public KansSpel(Speler speler) {
            this.speler = speler;
            this.kaartSpel = new KaartSpel();
            this.kaartSpel.Schudden();
            setStatus(SpelStatus.voorbereiding);
        }

        public void startSpel(KaartSoort troef, int inzetOpPunten, int inzetOpAantal)
        {
            setStatus(SpelStatus.bezig);
            setTroef(troef);
            zetIn(inzetOpPunten, inzetOpAantal);
            startBeurt();
        }

        public void startBeurt() {
            if (spelBeurten.Count() >= this.aantalKaarten) {
                status = "alle kaarten zijn gespeeld, kan geen nieuwe beurt beginnen";
                setStatus(SpelStatus.afgelopen);
            }
            if (spelBeurten.Count() == 0 || spelBeurten.Last().isGedaan()) {
                SpelBeurt spelBeurt = new SpelBeurt(this);
                this.spelBeurten.Add(spelBeurt);
            }
        }

        public void speelBeurt(Kaart kaart)
        {
            int aantalNull = 0;
            for (int i = 0; i < spelerKaarten.Count; i++)
            {
                if (spelerKaarten[i] == null)
                {
                    aantalNull++;
                }
            }
            if (aantalNull < 10)
            {
                spelerSpeeltKaart(kaart);
                computerSpeeltKaart();
                SpelBeurt beurt = new SpelBeurt(this);
                this.spelBeurten.Add(beurt);
                spelBeurten.Last().getPunten();
                if (spelBeurten.Last().getPunten() > 0)
                {
                    status = "Player win";
                }
                else
                {
                    status = "Computer win";
                }
                spelerKaart = null;
                computerKaart = null;
            }
            else
            {
                status = "Spel is afgelopen";
                int totaal = speler.Punten + spelPunten();
                speler.Punten = totaal;
            }
        }
        public void computerSpeeltKaart() {
            Boolean gevonden = false;
            while (!gevonden)
            {
                int index = new Random().Next(computerKaarten.Count);
                if (computerKaarten[index] != null)
                {
                    Kaart kaart = computerKaarten[index];
                    spelBeurten.Last().setComputerKaart(kaart);
                    computerKaarten[index] = null;
                    //computerKaarten.Remove(kaart);
                    gevonden = true;
                }
            }
        }

        public void spelerSpeeltKaart(Kaart kaart) {
            int index = 0;
            for (int i = 0; i < 10; i++)
            {
                if (kaart == spelerKaarten[i])
                {
                    index = i;
                }
            }
                if (spelerKaarten.Contains(kaart))
                {
                    spelBeurten.Last().setSpelerKaart(kaart);
                    spelerKaarten[index] = null;
                    //spelerKaarten.Remove(kaart);
                }
                else
                {
                    //speler heeft deze kaart niet, kan ze niet spelen
                }
        }

        public void setStatus(SpelStatus status) {
            if (this.spelStatus.Equals(SpelStatus.bezig) && status.Equals(SpelStatus.afgelopen))
            {
                speler.Punten += spelPunten();
            }

            this.spelStatus = status;
        }

        public String getStatus()
        {
            return status;
        }

        public int spelPunten() {
            int verdiendePunten = 0;
            int puntenBalans = 0;
            int beurtenBalans = 0;
            
            foreach (SpelBeurt beurt in spelBeurten)
            {
                puntenBalans += beurt.getPunten();
                beurtenBalans += beurt.getPunten() / beurt.getPunten();
            }

            if (puntenBalans > 0) {
                verdiendePunten += inzetOpPunten;
            }
            if (beurtenBalans > 0)
            {
                verdiendePunten += inzetOpAantal;
            }

            return verdiendePunten;
        }

        public void setTroef(KaartSoort troef){
            this.troef = troef;
            if (spelStatus == SpelStatus.voorbereiding) 
            {
                this.troef = troef;
                setTroef(troef);
            }
            else {
                status = "troef kan niet worden aangepast tijdens het spel";
            }
        }

        public KaartSoort getTroef()
        {
            return troef;
        }

        public bool isSpelerAanBeurt() {
            // als dit de eerste beurt is mag de speler beginnen
            if (this.spelBeurten.Count() <= 0)
            {
                return true;
            }
            // controleer wie gewonnen heeft de laatste beurt
            else if (spelBeurten.Last().getPunten() == 0)
            {
                return false;
            }
            else {
                return true;
            }
        }

        public void deelKaarten(int aantal) {
            if ((aantal * 2) <= this.kaartSpel.AantalKaarten())
            {
                for (int i = 0; i < aantal; i++)
                {
                    this.spelerKaarten.Add(this.kaartSpel.TrekBovensteKaart());
                    this.computerKaarten.Add(this.kaartSpel.TrekBovensteKaart());
                }
            }
            else {
                status = "er zijn niet genoeg kaarten om uit te delen";
            }
        }

        public List<Kaart> getSpelerKaarten()
        {
            return spelerKaarten;
        }

        public List<Kaart> getComputerKaarten()
        {
            return computerKaarten;
        }

        /// <summary>
        /// De inzet van de speler voor dit spel. De speler kan niet meer inzetten dan hij maximum kan verliezen.
        /// </summary>
        /// <param name="opPunten">De inzet op punten.</param>
        /// <param name="opAantal">De inzet op aantel.</param>
        public void zetIn(int opPunten, int opAantal) {
            int inzet = (opPunten + opAantal) * 2;
            if (inzet <= speler.Punten)
            {
                this.inzetOpAantal = opAantal;
                this.inzetOpPunten = opPunten;
                status = "U kan beginnen";
            }
            else {
                status = "inzet te hoog";
            }
        }

        public KaartSoort Troef
        {
            get { return troef; }
            set { troef = value; }
        }


    }

    public enum SpelStatus
    {
        voorbereiding = 0,
        bezig = 1,
        afgelopen = 2,
    }
}
